/**
 * 我要把这些所有产出的文件都打在一个压缩包
 * 1.知道本次编译产出了哪些文件
 * 2.如何向输出结果 里添加新的文件 其实就是那个压缩包
 */
const JSZip = require('jszip');
const path = require('path');
const {RawSource} = require('webpack-sources');
class ZipPlugin{
    constructor(options){
       this.options = options;
    }
    apply(compiler){
        compiler.hooks.compilation.tap('ZipPlugin',(compilation)=>{
            //每当构建完成的时候，准备好代码块资源文件的时候，
            compilation.hooks.processAssets.tapAsync('ZipPlugin',(assets,callback)=>{
                debugger
                let zip = new JSZip();
                for(let filename in assets){
                    //Source类的实例，它的source方法可以返回真正的源码
                    let source = assets[filename].source();
                    zip.file(filename,source);
                }
                zip.generateAsync({type:'nodebuffer'}).then((content)=>{
                    assets[this.options.filename.replace('[timestamp]',Date.now())]=new RawSource(content);
                    callback();
                });
            });
        });

        //emit是所有的资源已经计算完毕，准备开始写入硬盘的时机
/*         compiler.hooks.emit.tapAsync('ZipPlugin',(compilation,callback)=>{
                let zip = new JSZip();
                for(let filename in compilation.assets){
                    //Source类的实例，它的source方法可以返回真正的源码
                    let source = compilation.assets[filename].source();
                    zip.file(filename,source);
                }
                zip.generateAsync({type:'nodebuffer'}).then((content)=>{
                    compilation.assets[this.options.filename.replace('[timestamp]',Date.now())]=new RawSource(content);
                    callback();
                });
        }); */
    }
}
module.exports = ZipPlugin;